Use case: Generate PWM waveform with interrupts

Sequence diagram

@startuml
' To add a number by line
'autonumber
' Fix order of each column

participant "User Application" as App
participant "HAL HRTIM" as Driver

group HRTIM Initialization
App -[hidden]>Driver
end

group Timer A configuration

App -> Driver: HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &sConfig_timerA)
Driver -> Driver: Timer A interrupt mask is stored\ninto the HRTIM handle
Driver --> App : HAL_OK

App -> Driver: HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &dead_time_config)
Driver -> Driver: Timer A interrupt mask is stored\ninto the HRTIM handle
Driver --> App : HAL_OK

App->Driver : \nHAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &sConfig_compare);
Driver --> App : HAL_OK

App->Driver : HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base)
Driver --> App : HAL_OK

App->Driver : \nHAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &sConfig_output_config);
note right of App: From this point onward, HRTIM outputs are ready to be connected to the MCU I/Os.\nIn the GPIO controller, the selected HRTIM I/Os must be configured as per the alternate function mapping.
Driver --> App : HAL_OK

end

group Start Signal generation (interrupt mode)

 App -> Driver : HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1);
 Driver --> App : HAL_OK

 App -> Driver : HAL_HRTIM_WaveformCountStart_IT(&hhrtim, HRTIM_TIMERINDEX_TIMER_A)
 Driver --> App : HAL_OK

end

@enduml

Code snippet

HAL1

HAL2

Usage

 HRTIM_HandleTypeDef                 hhrtim;

 HRTIM_TimeBaseCfgTypeDef            sConfig_time_base;
 HRTIM_TimerCfgTypeDef               sConfig_timerA;
 HRTIM_OutputCfgTypeDef              sConfig_output_config;
 HRTIM_CompareCfgTypeDef             sConfig_compare;
 HRTIM_DeadTimeCfgTypeDef            dead_time_config;

 hhrtim1.Instance = HRTIM1;
 hhrtim1.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
 hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
 HAL_HRTIM_Init(&hhrtim);

/* Enable peripherals: HRTIM and GPIO Clocks, configure GPIO Pin*/
 .................
 ................

 sConfig_time_base.Period = 0x2000;
 sConfig_time_base.RepetitionCounter = 0x00;
 sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4;
 sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
 HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);

 sConfig_timerA.InterruptRequests = HRTIM_MASTER_IT_MCMP1;
 sConfig_timerA.DMARequests = HRTIM_MASTER_DMA_NONE;
 sConfig_timerA.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
 sConfig_timerA.InterleavedMode = HRTIM_INTERLEAVED_MODE_DISABLED;
 sConfig_timerA.StartOnSync = HRTIM_SYNCSTART_DISABLED;
 sConfig_timerA.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
 sConfig_timerA.DACSynchro = HRTIM_DACSYNC_NONE;
 sConfig_timerA.PreloadEnable = HRTIM_PRELOAD_ENABLED;
 sConfig_timerA.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
 sConfig_timerA.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
 sConfig_timerA.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;
 sConfig_timerA.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
 sConfig_timerA.ReSyncUpdate = HRTIM_TIMERESYNC_UPDATE_UNCONDITIONAL;
 HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &sConfig_timerA);

 dead_time_config.RisingValue = 0x5;
 dead_time_config.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
 HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &dead_time_config);

 dead_time_config.FallingValue = 0x3;
 dead_time_config.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
 HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &dead_time_config);

 /* Set compare register 1 in Timer A */
 sConfig_compare.CompareValue = 0x20;
 HAL_HRTIM_WaveformCompareConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &sConfig_compare);

 sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
 sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
 sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
 sConfig_output_config.SetSource = HRTIM_OUTPUTSET_TIMCMP1  ;
 sConfig_output_config.ResetSource = HRTIM_OUTPUTRESET_TIMPER ;
 HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &sConfig_output_config);

 /* Enable HRTIM's outputs TA1 */
 HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1);

 /* Start HRTIM TIMER A in interrupt mode */
 HAL_HRTIM_WaveformCountStart_IT(&hhrtim, HRTIM_TIMERINDEX_TIMER_A);
 hal_hrtim_handle_t                 hhrtim;

 hal_hrtim_timer_config_t           timer_a_config;
 hal_hrtim_output_config_t          output_config;
 hal_hrtim_deadtime_config_t        dead_time_config;

HAL_HRTIM_Init(&hhrtim, HAL_HRTIM1);

/* Enable peripherals: HRTIM and GPIO Clocks, configure GPIO Pin*/
 .................
 ................

timer_a_config.period = 0x2000;
timer_a_config.repetition = 0x00;
timer_a_config.prescaler = HAL_HRTIM_TIM_PRESCALER_DIV4;
timer_a_config.operating_mode = HAL_HRTIM_TIM_MODE_CONTINUOUS;
HAL_HRTIM_TIM_SetConfig(&hhrtim, HAL_HRTIM_TIMA,  &timer_a_config);

HAL_HRTIM_SetConfigInterrupts(&hhrtim, HAL_HRTIM_IT_TIMA, HAL_HRTIM_OPT_IT_CMP1);
HAL_HRTIM_TIM_EnablePreload(&hhrtim, HAL_HRTIM_TIMA);
HAL_HRTIM_TIM_EnableDeadtime(&hhrtim, HAL_HRTIM_TIMA);
HAL_HRTIM_TIM_SetUpdateSource(&hhrtim, HAL_HRTIM_TIMA, HAL_HRTIM_UPDATE_SOURCE_REPETITION);

dead_time_config.value = 0x5;
dead_time_config.sign = HAL_HRTIM_DEADTIME_POSITIVE;
HAL_HRTIM_TIM_SetConfigDeadtime(&hhrtim, HAL_HRTIM_TIMA, HAL_HRTIM_DEADTIME_RISING, &dead_time_config);

dead_time_config.value = 0x3;
HAL_HRTIM_TIM_SetConfigDeadtime(&hhrtim, HAL_HRTIM_TIMA, HAL_HRTIM_DEADTIME_FALLING, &dead_time_config);

/* Set compare register 1 in Timer A */
HAL_HRTIM_TIM_SetCompareValue(&hhrtim, HAL_HRTIM_TIMA, HAL_HRTIM_COMPARE_UNIT_1, 0x20);

 output_config.set = HAL_HRTIM_OUT_SET_CMP1;
 output_config.reset = HAL_HRTIM_OUT_RESET_PERIOD ;
 output_config.polarity = HAL_HRTIM_OUTPUT_ACTIVE_HIGH;
 output_config.idle_level = HAL_HRTIM_OUTPUT_IDLE_INACTIVE;
 output_config.fault_level = HAL_HRTIM_OUTPUT_FAULT_NONE;
 HAL_HRTIM_OUT_SetConfig(&hhrtim, HAL_HRTIM_CHA1, &output_config);

 /* Enable HRTIM's outputs CHA1 */
 HAL_HRTIM_OUT_Enable(&hhrtim, HAL_HRTIM_CHA1);

 /* Start HRTIM TIMER A in interrupt mode */
 HAL_HRTIM_TIM_Start_IT(&hhrtim,  HAL_HRTIM_TIMA);

Key changes

  • HAL2 configures interrupts explicitly (HAL_HRTIM_SetConfigInterrupts()) and starts the timer in IT mode with HAL_HRTIM_TIM_Start_IT().

  • HAL2 splits deadtime configuration across dedicated APIs (HAL_HRTIM_TIM_SetConfigDeadtime() / HAL_HRTIM_TIM_EnableDeadtime()).

  • HAL2 separates output configuration (HAL_HRTIM_OUT_SetConfig()) from output enabling (HAL_HRTIM_OUT_Enable()).